﻿#pragma once
#include "MarketDataBase.h"
#include "FrameData.h"
#include <QSharedMemory>
#include <QSystemSemaphore>
#include <deque>
#include "baseoption_global.h"

namespace MDIO
{
	class BASEOPTION_EXPORT KItem
	{
	public:
		KItem();
		~KItem();

		// 返回最后一根K线
		bool GetLastKItem(const std::string &pSymbolName, const tm &curDay, MData::KLineItem &outItem);
		// 倒序读取最后N根K线
		void ReverseReadKItems(const std::string &pSymbolName, time_t curDateTime, std::vector<MData::KLineItem> &outItems, int pN);
		// 添加最后一根K线
		void AppendKItem(const std::string &pSymbolName, const MData::KLineItem &pItem);
		// 更新最后1根K线返回是否更新成功
		bool UpdateLastKItem(const std::string &pSymbolName, const MData::KLineItem &pItem);
		// 读取所有的K线
		void ReadKItemFile(const std::string &pdbFile, std::deque<MData::KLineItem> &outKItems);
		// 读取某个时间范围内的K线
		void ReadKItemsInDays(const std::string &pSymbolName, time_t beginDay, time_t endDay, std::deque<MData::KLineItem> &outKItems);
		// 读取某个时间范围内的K线
		void ReadKItemsInTimes(const std::string &pSymbolName, time_t beginTime, time_t endTime, std::deque<MData::KLineItem> &outKItems);
		// 返回K线目录
		std::string GetKItemDir() { return m_kItemDir; }
	private:
		std::string m_kItemDir;
	};

	class BASEOPTION_EXPORT TMPKItem
	{
	public:
		TMPKItem();
		// 返回最新的临时K线
		void GetKItem(const std::string &pSymbolName, MData::KLineItem &outItem);
		// 修改最新的临时K线
		void UpdateKItem(const std::string &pSymbolName, const MData::KLineItem &pItem);
		// 返回K线临时目录
		std::string GetKItemDir() { return m_tmpKItemDir; };
		// 移除临时K线
		void RemoveTmpKItem(const std::string &pSymbolName);
	private:
		std::string m_tmpKItemDir; // 临时K线目录
	};

	class BASEOPTION_EXPORT Price
	{
	public:
		Price();
		// 添加价格
		void AppPrice(const std::string &pToday, const std::string &pSymbol, const MData::PriceItem &pItem);
		// 返回所有的价格
		void GetAllPrice(const std::string &pToday, const std::string &pSymbol, std::deque<MData::PriceItem> &outPrices);
		// 返回价格目录
		std::string GetPriceDir() { return m_priceDir; }
	private:
		std::string m_priceDir; // 行情价格目录
	};

	class ShareMemoryGard
	{
	public:
		ShareMemoryGard(QSharedMemory &pMemory);
		~ShareMemoryGard();
	private:
		QSharedMemory &m_memory;
	};

	class SystemSemaphoreGard
	{
	public:
		SystemSemaphoreGard(QSystemSemaphore &pSystemSemaphore);
		~SystemSemaphoreGard();
	private:
		QSystemSemaphore &m_systemSemaphore;
	};

	class BASEOPTION_EXPORT FrameData
	{
	public:
		FrameData();
		// 初始化
		bool Save(std::list<FData::FrameKItem> &pList/*, const KIndexType &msTimeStamp*/);
		// 从本地中获取
		bool Get(std::list<FData::FrameKItem> &outList/*, std::string &fileName*/);
		// 返回目录
		//std::string GetDir() { return m_frameDataDir; }
		// 是否共享内存
		void ReleaseData();
	private:
		// 行情文件的目录
		//std::string m_frameDataDir;

		QSharedMemory m_sharememory; // 共享内存
		QSystemSemaphore m_sysSemaphore; // 共享内存的信号量
	};
}
